package mx.com.asteca.vista;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.apache.commons.collections.CollectionUtils;
import org.primefaces.context.RequestContext;

import mx.com.asteca.comun.Constantes;
import mx.com.asteca.comun.dto.EstatusDTO;
import mx.com.asteca.comun.dto.PermisosBooleanDTO;
import mx.com.asteca.fachada.EstatusDocumentosFachada;
import mx.com.asteca.fachada.FachadaException;

@ManagedBean(name = Constantes.BEAN_ESTATUS_DOCUMENTO)
@ViewScoped
public class EstatusControlador extends BaseController {

	private final static String modulo = Constantes.MODULO_ESTATUS_DOCUMENTO;
	@ManagedProperty("#{estatusDocumentosFachadaImpl}")
	private EstatusDocumentosFachada fachadaEstatus;

	private List<EstatusDTO> listItems;
	private EstatusDTO itemSelected;
	private String input_nuevoNombre;
	private String input_nuevoDesc;
	private String input_editNombre;
	private String input_editDesc;

	private PermisosBooleanDTO permisos;

	@PostConstruct
	public void populate() {
		setPermisos(super.stablishSessionPermissions());
	}
	
	/**
	 * @param permisos the permisos to set
	 */
	public void setPermisos(PermisosBooleanDTO permisos) {
		this.permisos = permisos;
		super.setAlta(permisos.isAlta());
		super.setBorrar(permisos.isBorrar());
		super.setCambios(permisos.isEdicion());
		super.setConsulta(permisos.isConsulta());
		super.setImpresion(permisos.isImpresion());
	}

	private void initListaItems() {
		if (CollectionUtils.isEmpty(listItems)) {
			try {
				listItems = fachadaEstatus.getAll();
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_OBTENIENDO_LISTA_CATALOGO);
			}
		}
	}

	public void delete() {
		try {
			short id = itemSelected.getIdEstatus();
			fachadaEstatus.remove(itemSelected);
			listItems = null;
			initListaItems();
			super.addInfoMessage(Constantes.ACCION_DELETE_REGISTRO_EXITOSO_MENSAJE);
			super.addBitacora(Constantes.ACCION_DELETE_REGISTRO,
					Constantes.ACCION_DELETE_REGISTRO_EXITOSO_MENSAJE + "id: "
							+ id);
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_DELETE_REGISTRO);
			super.addBitacora(Constantes.ACCION_DELETE_REGISTRO,
					Constantes.ACCION_DELETE_REGISTRO_FALLIDO_MENSAJE);
		}
	}

	public void save() {
		if (input_nuevoNombre != null && !input_nuevoNombre.isEmpty()) {
			EstatusDTO dto = new EstatusDTO();
			dto.setDescEstatus(input_nuevoNombre);
			dto.setObsEstatus(input_nuevoDesc);
			try {
				short id = fachadaEstatus.save(dto);
				listItems = null;
				initListaItems();
				super.addInfoMessage(Constantes.ACCION_NUEVO_REGISTRO_EXITOSO_MENSAJE);
				super.addBitacora(Constantes.ACCION_NUEVO_REGISTRO,
						Constantes.ACCION_NUEVO_REGISTRO_EXITOSO_MENSAJE
								+ "id: " + id);
				RequestContext.getCurrentInstance().execute(
						"nuevoDialog.hide()");
			} catch (FachadaException e) {
				super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
						Constantes.ERROR_NUEVO_REGISTRO);
				super.addBitacora(Constantes.ACCION_NUEVO_REGISTRO,
						Constantes.ACCION_NUEVO_REGISTRO_FALLIDO_MENSAJE);
			}
		}
	}

	public void update() {
		if (input_editNombre.equals(itemSelected.getDescEstatus())
				&& input_editDesc.equals(itemSelected.getObsEstatus())) {
			super.addInfoMessage("Nada que actualizar");
			return;
		} 
		if (!(input_editDesc.equals(itemSelected.getObsEstatus()))) {
			if(!input_editDesc.isEmpty())
					itemSelected.setObsEstatus(input_editDesc);
		}
		if (!(input_editNombre.equals(itemSelected.getDescEstatus()))) {
			if(!input_editNombre.isEmpty())
				itemSelected.setDescEstatus(input_editNombre);
		} 
		try {
			fachadaEstatus.update(itemSelected);
			listItems = null;
			initListaItems();
			super.addInfoMessage(Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE);
			super.addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_EXITOSO_MENSAJE + "id: "
							+ itemSelected.getIdEstatus());
			RequestContext.getCurrentInstance().execute("editarDialog.hide()");
		} catch (FachadaException e) {
			super.addErrorMessage(Constantes.MESSAGE_TITLE_ERROR,
					Constantes.ERROR_UPDATE_REGISTRO);
			super.addBitacora(Constantes.ACCION_UPDATE_REGISTRO,
					Constantes.ACCION_UPDATE_REGISTRO_FALLIDO_MENSAJE);
		}
	}

	@Override
	String getModulo() {
		return modulo;
	}

	/**
	 * @return the listItems
	 */
	public List<EstatusDTO> getListItems() {
		initListaItems();
		return listItems;
	}

	/**
	 * @param listItems
	 *            the listItems to set
	 */
	public void setListItems(List<EstatusDTO> listItems) {
		this.listItems = listItems;
	}

	/**
	 * @return the itemSelected
	 */
	public EstatusDTO getItemSelected() {
		return itemSelected;
	}

	/**
	 * @param itemSelected
	 *            the itemSelected to set
	 */
	public void setItemSelected(EstatusDTO itemSelected) {
		this.itemSelected = itemSelected;
	}

	/**
	 * @return the input_nuevoNombre
	 */
	public String getInput_nuevoNombre() {
		return input_nuevoNombre;
	}

	/**
	 * @param input_nuevoNombre
	 *            the input_nuevoNombre to set
	 */
	public void setInput_nuevoNombre(String input_nuevoNombre) {
		this.input_nuevoNombre = input_nuevoNombre;
	}

	/**
	 * @return the input_nuevoDesc
	 */
	public String getInput_nuevoDesc() {
		return input_nuevoDesc;
	}

	/**
	 * @param input_nuevoDesc
	 *            the input_nuevoDesc to set
	 */
	public void setInput_nuevoDesc(String input_nuevoDesc) {
		this.input_nuevoDesc = input_nuevoDesc;
	}

	/**
	 * @return the input_editNombre
	 */
	public String getInput_editNombre() {
		return input_editNombre;
	}

	/**
	 * @param input_editNombre
	 *            the input_editNombre to set
	 */
	public void setInput_editNombre(String input_editNombre) {
		this.input_editNombre = input_editNombre;
	}

	/**
	 * @return the input_editDesc
	 */
	public String getInput_editDesc() {
		return input_editDesc;
	}

	/**
	 * @param input_editDesc
	 *            the input_editDesc to set
	 */
	public void setInput_editDesc(String input_editDesc) {
		this.input_editDesc = input_editDesc;
	}

	/**
	 * @return the fachadaEstatus
	 */
	public EstatusDocumentosFachada getFachadaEstatus() {
		return fachadaEstatus;
	}

	/**
	 * @param fachadaEstatus the fachadaEstatus to set
	 */
	public void setFachadaEstatus(EstatusDocumentosFachada fachadaEstatus) {
		this.fachadaEstatus = fachadaEstatus;
	}

	/**
	 * @return the permisos
	 */
	public PermisosBooleanDTO getPermisos() {
		return permisos;
	}

}
